package com.itheima.springbootwebtlias.controller;


import com.itheima.springbootwebtlias.anno.MyLog;
import com.itheima.springbootwebtlias.commons.CurrentHolder;
import com.itheima.springbootwebtlias.pojo.Dept;
import com.itheima.springbootwebtlias.pojo.Result;
import com.itheima.springbootwebtlias.service.DeptService;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Delete;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;


/**
 * 部门处理器类：处理部门相关请求
 */

/**
 * @RequestMapping
 * 设置请求路径，可以添加在方法和类上，一个完整的路径就是类上的路径+方法上的路径
 */
@Slf4j//lombok提供的功能注解：自动生成日志对象
@RequestMapping("/depts")
@RestController
public class DeptController {
//    //创建日志对象Logger
//    private static final Logger log =  LoggerFactory.getLogger(DeptController.class);

    @Autowired
    private DeptService deptService;

    //查询所有部门列表的处理器方法
    //@RequestMapping("/depts")
    @GetMapping//标识当前方法处理请求地址为/depts的GET请求
    public Result QueryAll(){
        //1.接收请求参数：无
        log.info("查询所有部门列表，请求参数：无");
        //2.调用业务层service层的功能方法，查询部门列表
        List<Dept> depts = deptService.selectAll();

        log.info("查询所有部门列表，查询完毕：{}",depts);
        //3.封装响应结果
        return Result.success(depts);
    }

/*
    //删除指定部门处理器方法
    @DeleteMapping("/depts")
    public Result removeById(HttpServletRequest request,
                             @RequestParam(value = "id", required = true, defaultValue = "10") Integer id2,
                             Dept dept,
                             @RequestParam Map map) {
        //1.接收请求参数：k = v
        //方式一：原始的方式HttpServletRequest （不推荐）
        String idStr = request.getParameter("id");
        int id = Integer.parseInt(idStr);
        System.out.println("HttpServletRequest接收参数: " + id);

        //方式二：框架，直接定义变量接收（请求参数数量 较少）
        System.out.println("定义变量接收参数: " + id2);

        //方式三：框架，直接定义对象接收（请求参数数量 较多）
        System.out.println("定义对象接收参数: " + dept);

        //方式四：框架，定义Map对象（请求参数数量 较多 + 没有现成的实体对象，不想单独创建实体对象接收） 注意：@RequestParam标识使用当前集合接收请求参数
        System.out.println("定义Map对象接收参数: " + map.get("id"));

        //2.调用业务层Service的功能方法，删除指定部门
        //这里缺少具体调用业务层方法代码，需补充，例如假设存在DeptService deptService; 且有removeById方法
        //deptService.removeById(id);

        //3.封装响应结果
        //这里没有实际封装，可根据业务需求返回合适的Result对象，例如假设Result有success方法返回成功结果
        return Result.success();
    }

 */

    //删除指定部门处理器方法

    @DeleteMapping
    public Result removeById(Integer id){
        //1.接收请求参数
        //直接定义变量接收：变量名称=参数名称一致

        log.info("删除指定部门，请求参数：{}",id);
        //2.调用业务层service的功能方法，删除指定部门
        deptService.removeById(id);//DML不需要返回值

        //3.封装响应结果
        return Result.success();
    }

    //添加部门处理器方法
    @PostMapping
    public Result save(@RequestBody Dept dept){
        log.info("controller save,当前线程：{},{}",Thread.currentThread().getName(), CurrentHolder.getCurrentId());
        //1.接收请求参数（json）
        //json接收参数：@RequestBody+实体对象/Map对象
        log.info("添加部门，请求参数：{}",dept);
        //2.调用业务层service的功能方法，添加部门
        deptService.saveDept(dept);
        //3.封装响应结果
        return Result.success();
    }

    //根据id查询部门处理器方法
    @GetMapping("/{id}")
    public Result findById(@PathVariable int id){
        //1.接收请求参数：path路径参数，作为请求路径的一部分
        //请求路径参数接收方式：@PathVariable定义变量
       log.info("根据id查询部门，请求参数：{}",id);
        //2.调用业务层service的功能方法，查询指定部门
        Dept dept = deptService.findById(id);
        log.info("根据id查询部门，查询结果：{}",dept);
        //3.封装响应结果
        return Result.success(dept);
    }

    //修改部门处理方法
    @PutMapping
    public Result update(@RequestBody Dept dept){
        //1.接收请求参数：json
        //JSON格式参数:@RequestBody+实体对象/Map对象
        log.info("更新部门，请求参数：{}",dept);

        //2.调用业务层service方法，修改部门
        deptService.update(dept);

        //3.封装响应结果
        return Result.success();
    }

}
